www.gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/GuidLaw.cpp

    #include "stdafx.h"
//Download by http://www.NewXing.com
#include "GuidLaw.h"
#include "Atmosphere.h"
#include "AeroForce.h"
#include "EarthModel.h"
#include "3DMODEL.h"

const double PI=3.1415926535 ;
const double RAD=180./PI ;

extern double now_time, t_start, t_start_1, t_start_2 ;
extern double S_ref ;

CGuidance::CGuidance( )
{
}

CGuidance::~CGuidance()
{
}
CAtmosphere *pAtmosphere_G = new CAtmosphere ;
CAeroForce  *pAeroForce_G =  new CAeroForce;
CEarth      *pEarth_G     =  new CEarth ; 

double  G, gr, g_we;

void CGuidance::Cal_Guidance( double XS[35], double& nyc, double& nzc )
{
	double cita_, Psi_, Ky, Kz ;
	G = pAtmosphere_G->Get_g_precision(XS[22], XS[17], gr, g_we );

	 if ( (XS[3]>50000) && (XS[15] < 6000.0 ) )  //真实目标
	{
    	Ky =4; 		
		cita_ = Ky * XS[25] + 0.04 * ( XS[24] - (-80)/RAD );		
	}
	else 
	{
		Ky =2; 
		cita_ = Ky * XS[25];
	}															//	XS[24] = q[0] ;	XS[25] = q[1] ;	

	if ( (XS[3]>50000) && (XS[15] < 15000.0 ) )  //真实目标
	{
    	Kz =4; 		
		Psi_ = Kz * XS[27] + 0.03 * ( XS[26] - (0)/RAD );
	}
	else 
	{
		Kz =2;
		Psi_ = Kz * XS[27] + 0.03 * ( XS[26] - (0)/RAD );
	}															//	XS[26] = q[2] ;	XS[27] = q[3] ;

	nyc = cita_ * XS[9]/G + cos( XS[10] );
	nzc = -Psi_ * XS[9]/G ;

	return ;
}

void CGuidance::Control( double XS[35] )
{
	double q,rho,Ma,Nyc,Nzc,Alpha,Beta;
	double m=XS[6];

	G = pAtmosphere_G->Get_g_precision(XS[22], XS[17], gr, g_we );
	rho = pAtmosphere_G->Get_rho_Airforce( XS[15] );
	q=0.5*rho*XS[9]*XS[9];
	Ma = pAtmosphere_G->GetMa_Airforce( XS[9],XS[15] );
	pAeroForce_G->Cal_Cxyz( );
	Cal_Guidance( XS, Nyc, Nzc );

	Alpha=0;	Beta=0;

	if ( ( XS[3]<40000 )&&( XS[15] <15000 ) &&  (now_time > 6.3)   ) //6.3s之前为主动段 
	{												    	//6.3s之后为虚拟比例导引段(15km高度)
		cout<<"虚拟比例导引 1"<<endl;

        Alpha = m*G * Nyc/( q*S_ref*pAeroForce_G->Cy_alpha )/RAD;
		Beta =  m*G * Nzc/( q*S_ref*pAeroForce_G->Cz_beta )/RAD;

        t_start = now_time;
		t_start_1 = now_time;
		t_start_2 = now_time;
		
		XS[13] = Alpha;							// 13 攻角
		XS[14] = Beta;							// 14 侧滑beta 
	}

	if ( ( XS[15] >15000 ) && ( t_start+0.01 ==now_time ) )		//15km之后为无控段
	{	
		cout<<"		  无控段"<<endl;

		Alpha=0.0;
		Beta=0;

        t_start = now_time;
		t_start_1 = now_time;
		t_start_2 = now_time;
		
		XS[13] = Alpha;							// 13 攻角
		XS[14] = Beta;							// 14 侧滑beta 
	}
   
	if ( ( XS[15] <15000 )&&( XS[15] >6000 ) && ( t_start_1+0.01 == now_time )  )		//从15km下降到6km为拉起段
	{
		cout<<"				   拉起段"<<endl;

	    Alpha= 5/RAD;
		Beta=m*G *Nzc/( q*S_ref*pAeroForce_G->Cz_beta )/RAD;

		t_start_1= now_time;
		t_start_2= now_time;
		
		XS[13] = Alpha;							// 13 攻角
		XS[14] = Beta;							// 14 侧滑beta 
	}	

	if ( ( XS[3]> 50000 )&&( XS[15] <6000 )  && ( t_start_2 < now_time )  )		//下降到6km之后为真实比例导引段
	{
	    cout<<"						真实比例导引 2 "<<endl;
		   		   
		Alpha = m*G * Nyc/( q*S_ref*pAeroForce_G->Cy_alpha )/RAD;
		Beta = m*G * Nzc/( q*S_ref*pAeroForce_G->Cz_beta )/RAD;
		if ( Alpha < -8/RAD )	//限幅
		Alpha = -8/RAD;
		 
		XS[13] = Alpha;							// 13 攻角
		XS[14] = Beta;							// 14 侧滑beta 
	}

	return ;
}

void CGuidance::Cal_Overload( double XS[35], double dXS[7] )
{
	double Nxc_o, Nyc_o, Nzc_o;			// 过载在发射坐标系中的投影launch
	double Nxc_2, Nyc_2;				// 过载在弹道坐标系中的投影
	double R0x, R0y, R0z;
	C3DModel * p3DModel_G = new C3DModel;

	G = pAtmosphere_G->Get_g_precision(XS[22], XS[17], gr, g_we );
	pEarth_G->Cal_R0_xyz( p3DModel_G->B0, p3DModel_G->A0, R0x, R0y, R0z ) ;
	
	Nxc_o = ( dXS[0] - gr * (XS[3] + R0x)/XS[22] - g_we * cos(XS[17]) * cos(p3DModel_G->A0) )/ G ;
	Nyc_o = ( dXS[1] - gr * (XS[4] + R0y)/XS[22] - g_we * sin(XS[17]) )/ G ;
	Nzc_o = ( dXS[2] - gr * (XS[5] + R0z)/XS[22] )/ G ;

	Nxc_2 = (  Nxc_o*( cos(XS[10])*cos(XS[11]) ) + Nyc_o * sin(XS[10]) + Nzc_o * ( -cos(XS[10])*sin(XS[11]) ) ) ;
	Nyc_2 = (  Nxc_o*( -sin(XS[10])*cos(XS[11]) ) + Nyc_o * cos(XS[10]) + Nzc_o * sin(XS[10])*sin(XS[11]) ) ;
	XS[33] = Nxc_2 ; 
	XS[34] = Nyc_2 ;

	return ;
}